<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>

        // 原型链  --- 追根溯源的过程




        const arr = [1, 2, 3];

        // 数组的实例化的对象  为什么可以访问 toString
        console.log(arr.toString());




        function Dog(name, age) {
            this.name = name;
            this.age = age;
            // this.toString = function () {
            //     return 3
            // }
        }

        Dog.prototype.type = '狗子';
        Dog.prototype.say = function () {
            console.log('wang');
        }
        // Dog.prototype.toString = function () {
        //     return 4
        // }

        const d = new Dog('哈士奇', 2);
        // 数组的实例化的对象  为什么可以访问 toString
        console.log(d.toString());


        console.log(d);
        //


        // 第一条原型链  从实例化对象开始的

        // 实例化的原型指向该构造函数的原型对象
        console.log(d.__proto__ === Dog.prototype);

        // prototype是一个对象   对象自然是由对象创建的
        // 原型对象的原型指向对象的原型对象
        console.log(Dog.prototype.__proto__ === Object.prototype);

        // Object 属于js中的根对象
        // 对象的原型对象的原型强制指向为空
        console.log(Object.prototype.__proto__ === null);


        // 一个对象是否拥有某个方法，首先去构造函数身上查找
        // 如果构造函数身上没有，就去原型对象上找
        // 如果原型对象上也没有，就去对象的原型对象上找
        // 报错




        // 第二条原型链  从构造函数开始的
        console.log(Dog.__proto__ === Function.prototype);

        console.log(Function.prototype.__proto__ === Object.prototype);

        console.log(Object.prototype.__proto__ === null);


    </script>

</body>

</html>